Docker コンテナで動く pcluster コマンドの実行環境の作り方紹介
AWS ParallelCluster の管理コマンド(pcluster
コマンド)の実行環境の作り方を紹介します。同じ実行環境を配布できるように実行環境には Docker コンテナを使用します。
実行環境の構築に必要なファイル
以下のリポジトリに保存してあります。M1 Mac(ARM)仕様の部分が一部ありますので x86-64 ユーザーが参考にされる場合は本文もご確認ください。
bigmuramura/container-pculster-command: Exeute pcluter commnad on Docker
コンテナへログインするまでの手順早見
git clone https://github.com/bigmuramura/container-pculster-command.git docker-compose build docker-compose up -d docker-compose exec pcluster fish
実行環境作成
pcluster
コマンドの実行環境は以下のリンクの参考を元に Docker ファイルを作成します。
以下の方針でコンテナ環境を作成します
pcluster
コマンドのバージョン管理ができること- Node.js のバージョン管理ができること
pcluster
コマンドで実行可能なコンテナ内で必要になりそうなコマンドもインストールしておく- AWS CLI や、jq コマンドなど
- AWS の認証情報は Assume ROle で得たクレデンシャルを使う
コンテナイメージの選定
前提条件を確認し、特定の OS の中で Node.js のインストール必須でした。node のベースイメージで ubuntu / debian 系のイメージを使用しているものを採用しました。
node - Official Image | Docker Hub
ParallelCluster のアップデートにより、要求される Node.js のバージョンが上がれば node のベースイメージを変更して更新する運用にします。
その他あると便利なもの
AWS CLI コマンドを利用できるようにしておきます。あとは私がfish
シェルユーザーなのでfish
シェルを使えるようにします。
Docker ファイル作成
AWS CLI のソースコードは ARM 用のものをダウンロードしています。x86-64 環境の場合は該当するソースコードをダウンロードするように変更してください。
FROM debian:stable as builder WORKDIR /tmp RUN apt-get update && apt-get install -y \ curl \ unzip RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip" RUN unzip awscliv2.zip FROM node:20.2.0-bullseye # Type the pcluster version you want to use ENV PCLUSTER_VERSION=3.6.0 COPY --from=builder /tmp/aws /tmp/aws RUN /tmp/aws/install RUN apt-get update && apt-get install -y \ python3=3.9.2-3 \ python3-pip \ git \ jq \ fish \ vim \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* RUN pip3 install aws-parallelcluster==$PCLUSTER_VERSION \ && mkdir /work
docker-compose ファイル作成
ParallelCluster のクラスターのコンフィグファイルを保存しておくディレクトリを/work
としてコンテナ側にマウントして、ワークフロー定義で使用するディレクトリや、ファイルをローカルからとコンテナからどちらかもアクセスできるようにしてあります。
version: '3' services: pcluster: build: context: ./pcluster dockerfile: Dockerfile volumes: - ./configs:/work:cached - ~/.aws:/root/.aws tty: true
ディレクトリ構成
pcluster
ディレクトリ配下にDockerfile
を保存しています。configs
ディレクトリは ParallelCluster のクラスターコンフィグを保存することを想定しています。
. ├── README.md ├── configs │ └── aaa.txt ├── docker-compose.yaml └── pcluster └── Dockerfile
イメージのビルド・実行
イメージをビルドしてコンテナを起動します。
docker-compose build docker-compose up -d docker-compose exec pcluster fish
コンテナが正常にビルド、コンテナ起動、ログインすると以下の様なプロンプトが表示されます。
Welcome to fish, the friendly interactive shell Type `help` for instructions on how to use fish root@0eb783a5b930 /#
バージョン確認
pcluster
コマンドが利用できるか、意図したバージョンの情報が返ってくるかチェックしましょう。
# pcluster version { "version": "3.6.0" }
pcluster
コマンドで AWS 環境を操作するにはコンテナ内から AWS アカウントへの認証情報が必要になります。私はローカルマシンで Assume Role から一時的な権限を取得してコンテナ内に貼り付けて利用しています。
export AWS_DEFAULT_REGION="ap-northeast-1" export AWS_ACCESS_KEY_ID="hoge" export AWS_SECRET_ACCESS_KEY="hoge" export AWS_SESSION_TOKEN="hoge"
ローカルマシンの~/.aws
ディレクトリは/root/.aws
にマウントしてあります。お好みの方法でコンテナ内に AWS の認証情報を渡してください。
# pwd /root/.aws # ll total 12K drwxr-xr-x 1 502 dialout 96 Aug 13 2022 cli/ -rw-rw-r-- 1 502 dialout 298 Jan 17 06:11 config -rw-rw-r-- 1 502 dialout 186 Jun 4 2022 credentials
以上で pcluster
コマンドの実行環境構築完了です。
ParallelCluster のアップデート対応
ここでは私の普段の運用方法を紹介します。
ParallelCluster バージョンのアップデートに合わせて、必要な各種ライブラリのバージョンが変更になる可能性があります。最新情報はユーザーガイドを参照してください。
Installing the AWS ParallelCluster command line interface (CLI) - AWS ParallelCluster
Dockerfile 修正
ENV PCLUSTER_VERSION=
で指定しているバージョン番号を修正します。
FROM debian:stable as builder WORKDIR /tmp RUN apt-get update && apt-get install -y \ curl \ unzip RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip" RUN unzip awscliv2.zip FROM node:20.2.0-bullseye # Type the pcluster version you want to use ENV PCLUSTER_VERSION=3.6.0 COPY --from=builder /tmp/aws /tmp/aws RUN /tmp/aws/install RUN apt-get update && apt-get install -y \ python3=3.9.2-3 \ python3-pip \ git \ jq \ fish \ vim \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* RUN pip3 install aws-parallelcluster==$PCLUSTER_VERSION \ && mkdir /work
再ビルド
--no-chache
オプションを付けてビルドします。
docker-compose build --no-cache docker-compose up -d docker-compose exec pcluster fish
普段のアップデート対応はこれだけです。動かなかったときに考えようと思っていますがまだ訪れていません。
おわりに
検証をよくするのでローカルマシンでクラスターのコンフィグを書いて、クラスターの作成まで完結させたかったです。かつ、ローカル環境を汚したくないのでコンテナを利用しここ1年ほどは本環境を利用しています。以前は VS Code リモートコンテナを利用していたのですが Docker Desktop から、Rancher Desktop に切り替えてから機能しなくなったので、シンプルに docker-compose を利用しています。